// hdu5696
// 题意：
// 给定n(<=100000)个数，定义一个区间的价值为这段区间的最大值乘以最小值。
// 现在问，对于所有区间长度的区间，区间价值的最大值分别是多少。
// 所有数都是随机生成。
//
// 题解：
// 首先我们可以进行一些基础分析。长度小的区间的最大值肯定大于长度大的区间
// 的最大值。最极端情况就是长度为1的情况，肯定它的区间价值最大值是最大的。
// 然后我们可以递归的处理当前区间[l, r]，先找到其中最小值的位置，
// 然后找到这段区间的最大值，用min*max更新长度为r-l+1的答案，然后递归
// 处理dfs(l, min_pos-1)和dfs(min_pos+1, r)。
// 最后O(n)的再从大到小更新答案。
//
// 为什么这个是对的呢，我们可以这么考虑，假设某个长度为k的区间[l, r]，
// 他的价值肯定会被长度>=k的区间计算到，因为我们划分序列总是按最小值去划分，
// 也就是说肯定这个被划分的出来的区间至少有某个会包含[l, r]且是以[l, r]
// 中的最小值为最小值，若不然，则[l, r]要么在那个最小值左边要么在最小值右边，
// 可以继续分下去知道是最小值相同为止。而[l, r]区间的价值是最小值乘以对应的
// 最大值，但是划分出来的那个包含它的区间价值肯定是大于等于它的价值的
// （因为最小值相同，最大值可能更大），所以答案肯定只会更优，且不会漏掉。
//
// 这样做的复杂度最坏是O(n^2)的，比如每次区间长度只减小1:
//   T(n)=T(n-1)+O(n)，得T(n)=O(n^2)。
// 不过这道题数据随机，所以可以认为:
//   T(n)=2*T(n/2)+O(n)，T(n)=O(n*log n)
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <algorithm>

int const maxn = 100007;
long long a[maxn], ans[maxn];
int n;

void dfs(int l, int r)
{
	if (l > r) return;
	long long min = a[l], pos = l, max = 0;
	for (int i = l; i <= r; max = std::max(max, a[i++]))
		if (a[i] < min) { min = a[i]; pos = i; }
	ans[r - l + 1] = std::max(ans[r - l + 1], min * max);
	dfs(l, pos - 1);
	dfs(pos + 1, r);
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n) {
		for (int i = 1; i <= n; i++) {
			std::cin >> a[i];
			ans[i] = 0;
		}
		dfs(1, n);
		for (int i = n - 1; i >= 1; i--)
			ans[i] = std::max(ans[i], ans[i + 1]);
		for (int i = 1; i <= n; i++)
			std::cout << ans[i] << '\n';
	}
}

